package com.chentf.spring.annotation.config;

import com.chentf.spring.annotation.bean.Person;
import com.chentf.spring.annotation.filter.MyTypeFilter;
import org.springframework.context.annotation.*;

/**
 * Person注解配置类方式，替换beans.xml配置文件
 * Created by chentianfu on 2018/4/8.
 */
// value指定要扫描的包, 默认是扫描当前包及其子包
//@ComponentScan(value = "com.chentf.spring.annotation")
//@ComponentScan(value = "com.chentf.spring.annotation", excludeFilters = {
//        /*
//		 * type：指定你要排除的规则，是按照注解进行排除，还是按照给定的类型进行排除，还是按照正则表达式进行排除，等等
//		 * classes：除了@Controller和@Service标注的组件之外，IOC容器中剩下的组件我都要，即相当于是我要排除@Controller和@Service这俩注解标注的组件。
//		 */
//        @ComponentScan.Filter(type= FilterType.ANNOTATION, classes = {Controller.class, Service.class})
//})
//@ComponentScan(value="com.chentf.spring.annotation", includeFilters={
//        /*
//         * type：指定你要排除的规则，是按照注解进行排除，还是按照给定的类型进行排除，还是按照正则表达式进行排除，等等
//         * classes：我们需要Spring在扫描时，只包含@Controller注解标注的类
//         */
//        @ComponentScan.Filter(type=FilterType.ANNOTATION, classes={Controller.class})
//}, useDefaultFilters=false)
@ComponentScans(value={
        @ComponentScan(value="com.chentf.spring.annotation", includeFilters={
                /*
                 * type：指定你要排除的规则，是按照注解进行排除，还是按照给定的类型进行排除，还是按照正则表达式进行排除，等等
                 */
                // 指定新的过滤规则，这个过滤规则是我们自个自定义的，过滤规则就是由我们这个自定义的MyTypeFilter类返回true或者false来代表匹配还是没匹配
                @ComponentScan.Filter(type=FilterType.CUSTOM, classes={MyTypeFilter.class})
        }, useDefaultFilters=false) // value指定要扫描的包
})
@Configuration //配置类注解
public class PersonConfig {

    /**
     * 我们在使用注解方式向Spring的IOC容器中注入JavaBean时，
     * 如果没有在@Bean注解中明确指定bean的名称，那么就会使用当前方法的名称来作为bean的名称；
     * 如果在@Bean注解中明确指定了bean的名称，那么就会使用@Bean注解中指定的名称来作为bean的名称。
     * @Bean注解是给IOC容器中注册一个bean，类型自然就是返回值的类型，id默认是用方法名作为id
     * @return
     */
    @Bean(name = "person")
    public Person person() {
        return new Person("chentf", 18,"chentf");
    }
}
